import {isInvalidData} from '@/utils/utils'
import {tip} from '@/utils/uni-api-wrap/toast'
import {isMPRelaxed} from '@/utils/validator'
import to from 'await-to-js'
import {postMeetingApply} from '@/api/meeting'
import {navigateBack} from '@/utils/uni-api-wrap/route'
import {usePages} from '@/hooks/usePages'

const initFormData = () => ({
  conferenceId: '', // 会议报名 - 会议ID
  registerType: '', // 会议报名 - 报名类型（1=项目方，2=邀请嘉宾，3=会员单位，4=非会员单位，5=特别增加人员）
  companyName: '', // 会议报名 - 公司名称
  firstName: '', // 会议报名 - 姓名（名字）
  lastName: '', // 会议报名 - 姓名（姓氏）
  mobile: '', // 会议报名 - 手机号码
  email: '', // 会议报名- 邮箱
  duties: '', // 会议报名 - 职务
  gender: '', // 会议报名 - 性别（0=未知，1=男，2=女）
  remark: '', // 会议报名 - 备注
  memberLevel: '', // 会员级别(1=会长单位，2=普通单位，3=理事单位)
  businessLicense: [], // 会议报名 - 营业执照
  businessCard: [], // 会议报名 - 个人名片
  accept: false,
})

export const useMeetingApply = () => {
  const { query } = usePages()
  const formData = reactive(initFormData())
  const memberIndex = ref('')

  const genders = ref([{ text: '男', subText: 'Male', value: 1 }, { text: '女', subText: 'Female', value: 2 }])
  const memberLevels = ref([{ text: '副会长及以上单位', value: 1 }, { text: '普通会员单位', value: 2 }, { text: '理事单位', value: 3 }])
  const payChannels = computed(() => JSON.parse(query.payChannels || '[]'))

  // 公共校验
  const commonCheck = (judeDuties = true) => {
    if (isInvalidData(formData.gender)) {
      tip('性别不能为空')
      return false
    }
    if (isInvalidData(formData.mobile)) {
      tip('手机号不能为空')
      return false
    }
    if (!isMPRelaxed(formData.mobile)) {
      tip('手机号格式不正确')
      return false
    }
    if (isInvalidData(formData.companyName)) {
      tip('公司名称不能为空')
      return false
    }
    if (judeDuties && isInvalidData(formData.duties)) {
      tip('职务不能为空')
      return false
    }
    if (!formData.accept) {
      tip('请同意《相关条款》')
      return false
    }
    return true
  }

  const submit = async (registerType = '', conferenceId) => {
    const data = { ...formData, conferenceId: conferenceId || query.meeting_id, registerType }
    delete data.accept
    const [err, result] = await to(postMeetingApply({
      ...data,
      memberLevel: memberIndex.value ? memberLevels.value[memberIndex.value].value : '',
      businessLicense: data.businessLicense[0]?.url || '',
      businessCard: data.businessCard[0]?.url || '',
    }))
    if (err) return
    if (result.code !== 0) return tip(result.msg)
    tip('报名成功')
    setTimeout(() => {
      // 重置
      Object.assign(formData, initFormData())
      navigateBack()
    }, 500)
  }

  return { formData, genders, memberLevels, memberIndex, payChannels, submit, commonCheck }
}
